package mymyoux.io.mserveur.mcontactClasses
{
	import flash.utils.clearTimeout;
	import flash.utils.setTimeout;
	
	import mymyoux.events.AMFPHPEvent;
	import mymyoux.events.MEventDispatcher;
	import mymyoux.io.AMFPHP;
	import mymyoux.io.mserveur.mcontactClasses.events.MLoginsEvent;
	import mymyoux.utils.Hash;
	     /**
         * MLogins dispatche cet évènement lorsqu'un login a été associé à un idx.
         * @eventType mymyoux.io.mserveur.mcontactClasses.events.MLoginsEvent
         */
        [Event(name="new_login", type="mymyoux.io.mserveur.mcontactClasses.events.MLoginsEvent")]
        /**
        * Permet de traduire un idx en Pseudonyme par l'intermédiaire d'un serveur AMFPHP.
        * <p><b>N'est normalement pas utilisé directement.</b></p>
        */
	public class MLogins extends MEventDispatcher
	{
		/**
		 * Représente une personne non identifiée.
		 */
		 protected var unidentified:People;
		/**
		 * Hash contenant une traduction logins-idxs
		 */
		protected var logins:Hash;
		/**
		 * Permet le dialogue avec le serveur PHP.
		 */
		protected var amfphp:AMFPHP;
		/**
		 * Timeout utilisé pour économiser les appels au serveur.
		 */
		protected var idTimeout:int=0;
		/**
		 * Crée un objet de type MLogins.
		 * @param amfphp AMFPHP utilisé pour contacter le serveur.
		 */
		public function MLogins(amfphp:AMFPHP)
		{
			logins=new Hash();
			this.amfphp=amfphp;
			unidentified=new People(0);
		}
		/**
		 * Indique si MLogins a déjà référencé l'idx qu'il possède un pseudonyme ou non.
		 * @return true si MLogins a déjà référencé l'idx indiqué.
		 */
		public function has(idx:uint):Boolean
		{
			return logins.containsKey(idx);
		}
		/**
		 * Indique si MLogins a déjà référencé  et s'il possède un pseudonyme.
		 * @return true si MLogins a déjà recherché le login de l'idx indiqué.
		 */
		public function hasLogin(idx:uint):Boolean
		{
			return logins.containsKey(idx) && !unidentified.equals(logins.get(idx) as People);
		}
		/**
		 * Renvoie le People d'un client identifié par son idx.
		 * @return Le People du client ou unidentified s'il n'est pas identifié.
		 * @see mymyoux.io.mserveur.mcontactClasses.People
		 */
		public function getPeople(idx:uint):People
		{
			return hasLogin(idx)?logins.get(idx) as People:null;
		}
		/**
		 * Ajoute un ou plusieurs idx comme référencé. Si un idx existe déjà la requête pour celui-ci est ignoré.
		 * Si aucune autre requête interromp le processus, une seconde plus tard une demande au serveur pour l'ensemble
		 * des pseudonymes manquants va être effectuée.
		 * @param idx Liste des idx à référencer.
		 */
		public function addIdx(idx:Array):void
		{
			var id:uint;
			for(var p:int=0;p<idx.length;p++)
			{
				id=Number(idx[p]);
				if(!logins.containsKey(id))
				{
					logins.put(id,unidentified);
				}
			}
			var ask:Array=logins.getKeys(unidentified);
			if(ask.length>0)
			{
				clearTimeout(idTimeout);
				//pour soulager un peu le serveur
				idTimeout=setTimeout(amfphp.call,1000,"getLogin",onLogins,ask);
			}
			
		}
		/**
		 * Associe à un idx son pseudonyme.
		 * Dispatche un évènement de type MLoginsEvent.NEW_LOGIN
		 * @param idx Idx. Il doit être positif et non nul, dans le cas contraire l'appel est ignoré.
		 * @param login Le Pseudonyme correspondant.
		 * @see mymyoux.io.mserveur.mcontactClasses.events.MLoginsEvent#NEW_LOGIN
		 */
		protected function savePeople(idx:uint,login:String):void
		{
			if(idx>0)
			{
				var people:People;
				if(hasLogin(idx))
				{
					people=logins.get(idx) as People;
				}
				else
				{
					people=new People(idx);
				}
				people.login=login;
				logins.put(idx,people);
				dispatchEvent(new MLoginsEvent(MLoginsEvent.NEW_LOGIN,people));
			}
		}
		/**
		 * Appelée par le serveur lorsque celui-ci répond à la demande de pseudonymes.
		 * Pour chacun des nouveaux pseudonymes, savePeople(idx,login) va être appelée.
		 * @param event Evenement renvoyé par le serveur AMFPHP.
		 * @see #savePeople()
		 */
		protected function onLogins(event:AMFPHPEvent):void
		{
			if(event.success)
			{
				var tab:Array=event.value;
				for(var p:String in tab)
				{
					savePeople(Number(p),tab[p]);
				}
			}else
			{
				trace("Error de récupération de login [MLogins] :" +event);
			}
		}
	}
}